\documentclass{beamer}
%% Para los gráficos
\usepackage{beamerthemesplit}
%\usepackage{tikz}	% Para los gráficos
\usepackage{graphicx} 
\usepackage{default}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}

\title{Alto nivel en \emph{Microcontroladores e Internet}}
\begin{document}
\frame{\titlepage}
\section[General]{Avrak}
\frame{\tableofcontents}

\section{Presente}
\subsection{Introducción}
\frame
{
  \frametitle{Definición del alto nivel}
  Los prinicpales del software de alto nivel son:
  \begin{itemize}
  \begin{item}<1-> Recolección de datos de las RTUs
    \begin{itemize}
      \item<1-> Tiempo real
      \item<2-> Histórico (almacenamiento)
    \end{itemize}
  \end{item}
  \item<3-> Representación visual del campo.
  \item<4-> Interacción con el campo.
    (Envío de comandos)
  \end{itemize}
}

\subsection{Motor SCADA}
\frame {
  \frametitle{El protocolo}
  
      Con ustedes...
      \pause
       \begin{center}
	  \includegraphics[scale=0.8]{res/MicroCNet-v11.pdf}
	  \\
	  \pause
	  \emph{uCnet}
      \end{center}
      \pause
      Denominamos SCADA al software encargado de dialogra con las RTUs.
      \begin{itemize}
	\item Su misión es recolectar datos (a través de polling),
	\item almacenarlos,
	\item hacerlos disponibles para alguna aplicación (GUI)
	\item y ejercer algún control (enviar comandos).
      \end{itemize}
}

\frame {
  \frametitle{Requisitos secundarios}
  \begin{itemize}
    \item{Cross Platform (correr sobre varios SOs)}\pause
    \item{Debe ser posible su utilización como CLI (posibilidad de correr sin GUI)}
    \emph{complejo desarrollar una GUI genérica}
    \pause
    \item{Agnóstico a la base de datos}\pause
    \item{Soportar futuras versiones de uCnet u otros protocolos con \emph{backsward compatibility}}
    %\item{Soportar alta concurrencia}
  \end{itemize}
} % end del frame
\frame{
  \frametitle{Elección de la tecnología en función de los requisitos}
  En función a los requisitos anteriores, 
  \begin{enumerate}
  \item Python es cross platform. Corre en varios sistemas operativos.\pause
  \item Python es un lenguaje de scripting, por lo cual alivana el desarrollo, 
   además puede ser \emph{freezado} como un binario propio de la plataforma\pause
  \item Python se presta para aplicaciones CLI, tiene una consola rica que puede
    ser explotada para extender aplicaciones.\pause
  \item Python cuenta muchos ORMs y proyectos similares, por lo cual se puede
    lograr cierta independencia de la base de datos.\pause
  \end{enumerate}
}
\frame{
  \frametitle{Alunos detalles importantes}
  \begin{itemize}
  \item<1-> Python es un lenguaje multiparadigma (Procedural, Objetos, Funcinal) de alto 
    nivel donde \emph{todo es un objeto}.
  \item<2-> El intérprete de Python posé un bloqueo global sobre los el contexto de ejeución, 
  cada hilo debe adquirir este lock para poderse ejecutar. Por defecto este lock se libera
  cada 100 instrucciones de máquina virtual.\footnote{http://docs.python.org/c-api/init.html}
  \item<3-> El intreprete no puede aprovechar los hilos del sistema operativo anfitrión, aunque
  se puede lograr paralelismo utilizando procesos.
  \end{itemize}
}
\frame{
  \frametitle{Twisted\footnote{http://twistedmatrix.com/}}
  Twisted es un framework de red orientad a aventos escrito en Python.
  Sus ideas fundamentales son
  \pause \\ 
  \textbf{Separación de Protocolos y transporte} \\
  Twisted fue diseñado de forma tal que existe una separación lógica entre el prtocolo de aplicación 
  (como POP3, HTTP, IRC, etc.) y el transporte subyacente (archivos, sockets o conexiones mediante librerías SSL).
  \pause \\
  \textbf{Deferreds} \\
  El concepto de Deferred (a veces llamado future o promesa) se refiere a un valor que aún no ha sido computado.
  Por ejemplo, por que necesita datos de un peer remoto. Un Deferred puede ser pasado entre funcniones, pero 
  no se puede preguntar su valor de manera directa.
}
\frame{
  \frametitle{Twised - Deferreds (cont)}
  A cada Deferred se le puede agergar una cadena de callbacks,
  siendo la salida de cada callback la entrada del siguiente. A cada callback se puede añadir un errback, que 
  se ejecuta en caso de ocurrir una excepción.
  \\ \pause
  \textbf{Soporte de Threads}\\
  Twsited propone una abstracción sobre los hilos tradicionales, utilizando un thread como fuente para un Deferred.
  El Deferred recuperará el valor tan poronto el thread termine. Se pueden agregar callbacks a este Deferred que
  serán ejecutados en el hilo principal.
  \\ \pause
  \textbf{Integración con bucles de ejecución de otras librerías}
  Twisted se puede integrar con loops de eventos de otras lbirerías como 
  las de GTK+, Qt y Cocoa(utilizando PyObjC). 

}
\frame{
  \frametitle{Twised - Foreign Loops (cont)}
  Esto permite utilizar twisted para apliaciones con GUI utilizando todas
  sus librerías sin agregar el típio overhead de un hilo por socket.
  Se puede motnar un servidor web completo integrado con una aplicación
  visual aprovechando esta característica.
  \pause
  \\
  El reactor\footnote{http://en.wikipedia.org/wiki/Reactor\_pattern} de twsited es un scheduler que utiliza \emph{select()}\footnote{
  http://en.wikipedia.org/wiki/Select\_(Unix)}. Las cadenas de callbacks de los
  Deferreds y los timers son manejados por el reactor.
  \\
  Menos problemas de sincronización.
}
\begin{frame}[fragile]

  \frametitle{Twisted}
  Ejemplo simple de echo
  \begin{verbatim}
from twisted.internet import protocol, reactor
class MiEchoProtocol(protocol.Protocol):
    def dataReceived(self, data):
      self.transport.write( data )
class ClientFactory( protocol.ClientFactory )
    protocol = MiEchoProtocol
reactor.connectTCP( '127.0.0.1', 5432, ClientFactory())
\end{verbatim}
\end{frame}

\begin{frame}
 \frametitle{Almacenamiento}
  SQLAlchemy es un ORM para Python. Basicamente asociar registros 
  a objetos y encapsular el DML\footnote{http://es.wikipedia.org/wiki/DML}.
  Abstrae en Python el DDL\footnote{http://es.wikipedia.org/wiki/Lenguaje\_de\_definici\%C3\%B3n\_de\_datos}.
  
  A través del módulo dbapi de la librería estándar de Python soporta un buen número de bases de datos.

  Cambiar la base de datos es cuestión de cambiar la URL de conexión.
  \emph{tipo://user:pass@host/base/}

  
\end{frame}


\begin{frame}
  \frametitle{Almacenamiento}
  En la base de datos se cuentan con las siguientes tablas relacionadas con la adquisición de datos
  \begin{center}
   \includegraphics[scale=0.45]{modelo_db_basico.pdf}
  \end{center}
\end{frame}

\subsection{GUI}
\begin{frame}
 \frametitle{Almacenamiento}
  Esquema final de la base de datos para el sistema de semaforización:
  \begin{center}
   \includegraphics[scale=0.4]{esquema_db_completo.pdf}
  \end{center}
  Cada entrada se define como punto y tiene una dirección dada por el CO, la UC, el tipo y número
  de puerto.
  
\end{frame}
\frame{
  \frametitle{Almacenamiento - Punto}
  \begin{itemize}
  \item [Punto] Cada entrada se define como punto y tiene una dirección dada por el CO, la UC, el tipo y número
  de puerto y número de bit si se aplica.

  
  \item [Puerto] En el software de la UC se creo un mapeo secuencia de puertos de ``alto nivel'' a los puertos físicos.
  De esta forma se presentan como un vector uniforme ante la aplicación de alto nivel.
  
  \textbf{Movimiento} En el sistema de semáforos asociaba 2 bits a una conjunto de lámparas. Esta entidad es la abstracción
    de alto nivel de una ``entidad'' del hardware que puede estar trabajando sobre uno o más bits o bytes.
    Arreglo de puntos.
  \end{itemize}
}

\begin{frame}
 \frametitle{GUI}
  Qt es un toolkit de desarrollo de aplicaciones para C++.
  PyQt4 es un \emph{binding} para Python de este toolkit.
  Qt presenta algunas características interesantes:
  \begin{itemize}
    \item Módulo \textbf{QtSql}, interacción con bases de datos ala RAD (Access, VB, Delphi, etc.)
    
    \begin{item}Módulo \textbf{QtGui}, conjunto de widgets con un subframwork de 
      gráficos en el cual existe una escena, un visor y un conjunto de items.
      \begin{itemize}
	\item Tanto la escena, el visor o los items son ``vectoriales'', se les pueden
	  aplicar matrices de transformación.
	\item Movimiento con el mouse sencillo
	\item Capas
      \end{itemize}
    \end{item}
  \end{itemize}
\end{frame}
\begin{frame}
  \frametitle{Qt partes no exploradas}
  \begin{itemize}
   \item Módulo \textbf{QtScript} permite hacer scripting de la aplicación
    mediante ECMAScript (Javascript).
   \item Módulo \textbf{QtSvg}, renderización de gráficos vectoriales.
   \item Módulo \textbf{QtWebKit}, motor de renderización de HTML WebKit (el motor 
    de Safari (browser de MacOS, iPhone). Posibilidad de integración con WMS\footnote{
      http://es.wikipedia.org/wiki/Web\_Map\_Service
    }
    \item Módulo \textbf{QtOpenGL}, 3D.
    \item Extensiones \textbf{PyQwt}, gráficos estadísticos.
  \end{itemize}

\end{frame}

% \begin{frame}
%  \frametitle{La GUI y la DB}
%   
% \end{frame}
\section{Futuro}
%\subsection*{Separación de GUI de adquisición de datos}
\begin{frame}[fragile]
  \frametitle{Nueva arquitectura}
  La interfase web todavía no ha sido explorada. La web sestá sufriendo
  importantes cambios que apuntan a una mejor interactividad.
  \pause\\
  Aprovechando la ubicuidad de HTTP y planteando un esquma de RPC (en general
  en HTTP se lo suele llamar ``web service'') se puede ganar generalidad
  en el SCADA.
  \pause\\
  Los mecanismos de codifcación de información más populares sobre HTTP son XML y JSON.
  Existe un mecanismo de RPC que se basa en cada codificación
\end{frame}

\begin{frame}[fragile]
  \frametitle{XMLRPC}
  \textbf{Invocación desde el cliente}
  \begin{verbatim}
  <?xml version="1.0"?>
  <methodCall>
    <methodName>org.wikipedia.intercambioDatos</methodName>
    <params>
      <param>
         <value><i4>360</i4></value>
      </param>
      <param>
         <value><i4>221</i4></value>
      </param>
    </params>
  </methodCall>
  \end{verbatim}
  
\end{frame}
\begin{frame}[fragile]
  \frametitle{XMLRPC - Respuesta }

\textbf{Respuesta desde el servidor}
  \begin{verbatim}
  <?xml version="1.0"?>
  <methodResponse>
    <params>
      <param>
        <value><string>Intercambio datos nro. 
             360 por 221</string></value>
      </param>
    </params>
  </methodResponse>

  \end{verbatim}
\end{frame}

\begin{frame}[fragile]
  \frametitle{JSONRPC 1.0}
  \textbf{Petición del cliente}
  \begin{verbatim}
{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
  \end{verbatim}
 
  \textbf{Respuesta del servidor}
  \begin{verbatim}
{ "result": "Hello JSON-RPC", "error": null, "id": 1}
  \end{verbatim}
Existe una notable diferencia entre la cantidad de datos enviados
por llamadas RPC similares
\end{frame}

\begin{frame}
  \frametitle{Scada Cliente Servidor}
  HTTP/HTTPS como capa de ``transporte'' para RPC:
  \begin{itemize}
    \item Es estándard
    \item HTTPS contempla seguridad
    \item HTTP PUSH\footnote{http://en.wikipedia.org/wiki/Push\_technology} o streaming (socket abierto).
  \end{itemize}
  JSON como codificación de datos
  \begin{itemize}
   \item Es leible por el humano
   \item Los browsers están adquiriendo capacidades de pareso nativo.
   \item Contempla comunicación semi-P2P.
  \end{itemize}

  La comunicación entre los clientes (no solo GUIs) y el servidor SCADA 
  se realizan mediante JSONRPC. Se define una API.
\end{frame}

\begin{frame}
 \frametitle{Arquitectura}
  \begin{center}
   \includegraphics[scale=0.35]{arquitectura.pdf}
  \end{center}
\end{frame}
\begin{frame}
  \frametitle{JSONRPC API}
  La API JSONRPC permitiría
    \begin{itemize}
      \item Configuración 
      \item Consulta de puntos
      \item Envío de comandos
      \item Comunicación asincrónica P2P (escencial para el módulo alertas)
      \item Inicio de sesión (HTTPS?)
      \item Control de acceso
    \end{itemize}
  El cliente del SCADA se puede escribir en cualquier lenguaje bajo cualquier
  plataforma.
\end{frame}
\begin{frame}
  \textbf{GUI Framework}\\
  Configuración visual DnD.\\
  \textbf{WEB}\\
  Llamadas asincrónicas a la API. Quizás mashups con WMS de Mapserver o Mapnik.
  En focalizado en función del potencial cliente.
  \\
  \textbf{Móviles}\\
  Interfase propia de la plataforma, por tamaño del dispay. Ejeción de javascript
  inexistente o costosa (\emph{Ej: blackberry})\\
  \textbf{Alertas}\\
  Ejecución de procesos en función de ciertos estados, tabla de cuando vs que.
  Envío de mails, envío de SMS, accionamiento de algun PBX, etc.\\
  \textbf{Otros clientes}\\
  Hibridos con Flex, XUL o alguna otra tecnología para GUIs.
\end{frame}
\begin{frame}
 \frametitle{Algunos detalles}
  \begin{itemize}
    \item El esquema cliente servidor se presenta inadecuado para estadísticas.
      ¿RPC sobre un DSL como R? \emph{Se escuchan propuestas!}
    \item Obtención de datos de GPS
  \end{itemize}
\end{frame}
\end{document}
